﻿using System;
using System.Linq;
using System.Linq.Expressions;
using System.Web.UI.WebControls;
using Icbf.EXTUD.Entity;
using UD.EXTUD.Service;
using UD.SYSEXTUD.MASTER;
using UD.Utilities.Exceptions;

namespace UD.SYSEXTUD.CONVENIOS
{
    public partial class List : System.Web.UI.Page
    {
        EXTUDService oEXTUDService = new EXTUDService();

        /// <summary>
        /// Guarda el criterio de ordenamiento de la grilla
        /// </summary>
        public string GridViewSortExpression
        {
            get { return (string)ViewState["sortExpression"]; }
            set { ViewState["sortExpression"] = value; }
        }

        /// <summary>
        /// Guarda la dirección de ordenamiento del gridview
        /// </summary>
        public SortDirection GridViewSortDirection
        {
            get
            {
                if (ViewState["sortDirection"] == null)
                    ViewState["sortDirection"] = SortDirection.Ascending;

                return (SortDirection)ViewState["sortDirection"];
            }
            set { ViewState["sortDirection"] = value; }
        }

        protected void Page_PreInit(object sender, EventArgs e)
        {
            UtilesHelper.SetTituloPagina(this.Master, Request.QueryString[UtilesHelper.queryStringTituloPagina]);
            SYSEXTUDMasterPage masterPage = (SYSEXTUDMasterPage)this.Master;
            masterPage.eventoNuevo += new MasterPageDelegate(masterPage_eventoNuevo);
            masterPage.eventoBuscar += new MasterPageDelegate(masterPage_eventoBuscar);
        }


        void masterPage_eventoBuscar(object sender, EventArgs e)
        {
            Buscar();
        }

        void masterPage_eventoNuevo(object sender, EventArgs e)
        {
            Response.Redirect("Add.aspx?titulo=REGISTRO CONVENIOS");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                CargarDatosIniciales();
            }
        }

        private void CargarDatosIniciales()
        {
           
        }

        private void Buscar()
        {
            try
            {
                CargarGrilla(gvConvenios, GridViewSortExpression, true);
            }
            catch (UserInterfaceException ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
            catch (Exception ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
        }


        /// <summary>
        /// Cargar una grilla con ordenamiento
        /// </summary>
        /// <param name="gridViewsender">Grilla a ordenar</param>
        /// <param name="expresionOrdenamiento">Columna que sirve de criterio para ordenar</param>
        /// <param name="cambioPaginacion">indica si el metodo se envia desde el evento PageIndexChanging de la grilla</param>
        private void CargarGrilla(BaseDataBoundControl gridViewsender, string expresionOrdenamiento, bool cambioPaginacion)
        {
            //////////////////////////////////////////////////////////////////////////////////
            //////Aqui va el código de llenado de datos para la grilla 
            //////////////////////////////////////////////////////////////////////////////////

            //Lleno una lista con los datos que uso para llenar la grilla
            try
            {
                String vNombreConvenio = null;
                String vEstadoConvenio = null;
                String vContratante = null;
                int? vDuracionConvenio = null;
    
                if (txtNombreConvenio.Text != "")
                {
                    vNombreConvenio = Convert.ToString(txtNombreConvenio.Text);
                }
                if (UtilesHelper.ValidarSeleccionDropDownList(ddlEstadoConvenio))
                {
                    vEstadoConvenio = ddlEstadoConvenio.SelectedItem.Text;
                }
                if (txtContratante.Text != "")
                {
                    vContratante = Convert.ToString(txtContratante.Text);
                }

                var myGridResults = oEXTUDService.ConsultarConvenios(vNombreConvenio, vEstadoConvenio, vContratante, vDuracionConvenio);
                //////////////////////////////////////////////////////////////////////////////////
                //////Fin del código de llenado de datos para la grilla 
                //////////////////////////////////////////////////////////////////////////////////

                if (expresionOrdenamiento != null)
                {
                    //Si la expresión de ordenamiento (columna) cambió, entonces la direccion de ordenamiento es ascendente
                    if (string.IsNullOrEmpty(GridViewSortExpression))
                    {
                        GridViewSortDirection = SortDirection.Ascending;
                    }
                    else if (GridViewSortExpression != expresionOrdenamiento)
                    {
                        GridViewSortDirection = SortDirection.Descending;
                    }
                    if (myGridResults != null)
                    {
                        var param = Expression.Parameter(typeof(Convenio), expresionOrdenamiento);

                        //La propiedad de mi lista, esto es "Entidad.CualquierCampo"
                        var prop = Expression.Property(param, expresionOrdenamiento);

                        //Creo en tiempo de ejecución la expresión lambda
                        var sortExpression = Expression.Lambda<Func<Convenio, object>>(Expression.Convert(prop, typeof(object)), param);

                        //Dependiendo del modo de ordenamiento . . .
                        if (GridViewSortDirection == SortDirection.Ascending)
                        {

                            //Si no viene del evento de paginacion (busqueda normal), entonces cambio la direccion de ordenamiento
                            if (cambioPaginacion == false)
                            {
                                GridViewSortDirection = SortDirection.Descending;
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderByDescending(sortExpression).ToList();
                            }
                            else
                            {
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderBy(sortExpression).ToList();
                            }
                        }
                        else
                        {

                            //Si no viene del evento de paginacion (busqueda normal), entonces cambio la direccion de ordenamiento
                            if (cambioPaginacion == false)
                            {
                                GridViewSortDirection = SortDirection.Ascending;
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderBy(sortExpression).ToList();
                            }
                            else
                            {
                                gridViewsender.DataSource = myGridResults.AsQueryable().OrderByDescending(sortExpression).ToList();
                            }
                        }

                        GridViewSortExpression = expresionOrdenamiento;
                    }
                }
                else
                {
                    gridViewsender.DataSource = myGridResults;
                }

                gridViewsender.DataBind();
            }
            catch (UserInterfaceException ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
            catch (Exception ex)
            {
                //toolBar.MostrarMensajeError(ex.Message);
            }
        }

        protected void gvConvenios_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        protected void gvConvenios_Sorting(object sender, GridViewSortEventArgs e)
        {

        }

        protected void gvConvenios_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {

        }

    }
}